/**
 * HTTP请求工具
 */

// 基础URL，实际项目中替换为真实的API地址
// const BASE_URL = 'https://pic.shansongkeji.com/api';
const BASE_URL = 'http://localhost:9999/api';
// 请求拦截器
const requestInterceptor = (config) => {
	// 获取token
	const token = uni.getStorageSync('token');
	if (token) {
		config.header = {
			...config.header,
			'Authorization': `Bearer ${token}`
		};
	}

	// 添加跨域请求所需的header
	config.header = {
		...config.header,
		'X-Requested-With': 'XMLHttpRequest'
	};

	// 只有非上传请求才设置Content-Type为application/json
	if (!config.isUpload) {
		config.header['Content-Type'] = 'application/json';
	}

	return config;
};

// 响应拦截器
const responseInterceptor = (response) => {
	// 请求成功
	if (response.statusCode >= 200 && response.statusCode < 300) {
		return response.data;
	}

	// 未授权，需要登录
	if (response.statusCode === 403) {
		uni.showToast({
			title: '请先登录',
			icon: 'none'
		});

		// 清除token
		uni.removeStorageSync('token');

		// 跳转到登录页
		setTimeout(() => {
			uni.navigateTo({
				url: '/pages/login/login'
			});
		}, 1500);

		return Promise.reject(new Error('未授权，请先登录'));
	}

	// 其他错误
	uni.showToast({
		title: response.data?.message || `请求失败(${response.statusCode})`,
		icon: 'none'
	});

	return Promise.reject(new Error(response.data?.message || `请求失败(${response.statusCode})`));
};

/**
 * 发送HTTP请求
 * @param {Object} options - 请求选项
 * @returns {Promise} 返回请求结果的Promise
 */
const request = (options) => {
	// 应用请求拦截器
	options = requestInterceptor(options);

	// 拼接完整URL
	if (options.url.indexOf('http') !== 0) {
		options.url = BASE_URL + options.url;
	}

	return new Promise((resolve, reject) => {
		uni.request({
			...options,
			success: (res) => {
				try {
					const result = responseInterceptor(res);
					resolve(result);
				} catch (error) {
					reject(error);
				}
			},
			fail: (err) => {
				uni.showToast({
					title: '网络请求失败，请检查网络连接',
					icon: 'none'
				});
				reject(new Error('网络请求失败'));
			}
		});
	});
};

/**
 * GET请求
 * @param {string} url - 请求地址
 * @param {Object} data - 请求参数
 * @param {Object} options - 其他选项
 * @returns {Promise} 返回请求结果的Promise
 */
export const get = (url, data = {}, options = {}) => {
	return request({
		url,
		data,
		method: 'GET',
		...options
	});
};

/**
 * POST请求
 * @param {string} url - 请求地址
 * @param {Object} data - 请求参数
 * @param {Object} options - 其他选项
 * @returns {Promise} 返回请求结果的Promise
 */
export const post = (url, data = {}, options = {}) => {
	return request({
		url,
		data,
		method: 'POST',
		...options
	});
};

/**
 * PUT请求
 * @param {string} url - 请求地址
 * @param {Object} data - 请求参数
 * @param {Object} options - 其他选项
 * @returns {Promise} 返回请求结果的Promise
 */
export const put = (url, data = {}, options = {}) => {
	return request({
		url,
		data,
		method: 'PUT',
		...options
	});
};

/**
 * DELETE请求
 * @param {string} url - 请求地址
 * @param {Object} data - 请求参数
 * @param {Object} options - 其他选项
 * @returns {Promise} 返回请求结果的Promise
 */
export const del = (url, data = {}, options = {}) => {
	return request({
		url,
		data,
		method: 'DELETE',
		...options
	});
};

/**
 * 上传文件
 * @param {string} url - 上传地址
 * @param {string} filePath - 文件路径
 * @param {string} name - 文件对应的key
 * @param {Object} formData - 其他表单数据
 * @param {Function} onProgress - 上传进度回调
 * @returns {Promise} 返回上传结果的Promise
 */
export const upload = (url, filePath, name = 'file', formData = {}, onProgress = null) => {
	// 应用请求拦截器
	const options = requestInterceptor({
		isUpload: true
	});

	// 拼接完整URL
	if (url.indexOf('http') !== 0) {
		url = BASE_URL + url;
	}

	return new Promise((resolve, reject) => {
		const uploadTask = uni.uploadFile({
			url,
			filePath,
			name,
			formData,
			header: options.header,
			success: (res) => {
				try {
					// 解析返回的JSON数据
					let data = JSON.parse(res.data);
					const result = responseInterceptor({
						statusCode: res.statusCode,
						data
					});
					resolve(result);
				} catch (error) {
					uni.showToast({
						title: '上传失败，返回数据格式错误',
						icon: 'none'
					});
					reject(new Error('上传失败，返回数据格式错误'));
				}
			},
			fail: (err) => {
				console.error('上传失败', err);
				uni.showToast({
					title: '上传失败，请检查网络连接',
					icon: 'none'
				});
				reject(new Error('上传失败'));
			}
		});

		// 监听上传进度
		if (onProgress && uploadTask) {
			uploadTask.onProgressUpdate((res) => {
				onProgress(res.progress);
			});
		}
	});
};

/**
 * 下载文件
 * @param {string} url - 下载地址
 * @param {Function} onProgress - 下载进度回调
 * @returns {Promise} 返回下载结果的Promise
 */
export const download = (url, onProgress = null) => {
	// 应用请求拦截器
	const options = requestInterceptor({});

	// 拼接完整URL
	if (url.indexOf('http') !== 0) {
		url = BASE_URL + url;
	}

	return new Promise((resolve, reject) => {
		const downloadTask = uni.downloadFile({
			url,
			header: options.header,
			success: (res) => {
				if (res.statusCode === 200) {
					resolve(res.tempFilePath);
				} else {
					uni.showToast({
						title: `下载失败(${res.statusCode})`,
						icon: 'none'
					});
					reject(new Error(`下载失败(${res.statusCode})`));
				}
			},
			fail: (err) => {
				uni.showToast({
					title: '下载失败，请检查网络连接',
					icon: 'none'
				});
				reject(new Error('下载失败'));
			}
		});

		// 监听下载进度
		if (onProgress && downloadTask) {
			downloadTask.onProgressUpdate((res) => {
				onProgress(res.progress);
			});
		}
	});
};

// 导出默认对象
export default {
	get,
	post,
	put,
	del,
	upload,
	download
};
